注意:所有文章除特别说明外,转载请注明出处.
[TOC]
第一章 Java多线程技能
1.1 继承Thread类
提示:使用多线程技术时,代码运行结果与代码执行顺序或调用顺序无关。线程调用的随机性。
注意:执行start()方法的顺序不代表线程启动的顺序。
1.2 实现Runnable接口
提示:Thread构造函数支持传进一个Runnable接口对象。其不光可以传入Runnable接口的对象,还可以传入一个Thread类的对象,这样做完全可以将一个Thread对象中的run()方法交由其它线程进行调用。
1.3 实例变量与线程安全
自定义线程类中的实例变量针对其它线程可以可以有共享与不共享之分,这在多个线程之间进行交互时很重要。
1.3.1 数据不共享
每个线程都各自执行自己的count变量,自己减少自己的count变量值。线程之间变量不共享。不存在多线程访问同一个实例变量的情况。
1.3.2 数据共享
数据共享情况就是多线程可以访问同一个变量。
1.4 currentThread()方法
自定义的线程内部不是同时被同一个线程调用。
1.5 isAlive()方法
isAlive()方法判断当前线程是否处于活动状态。
1.5 sleep()方法
1.6 停止线程
大多数停止一个线程的操作使用 Thread.interrupt()方法,尽管方法的名称是终止的意思,但是这个方法不会终止一个正在运行的线程,还需要加入一个判断才可以完成线程的停止。
1.6.1 Java中三种终止正在运行线程方法
1.使用退出标志,使得线程正常退出,也就是当run()方法完成后线程终止
2.使用stop()方法强行终止线程
3.使用 interrupt() 方法中断线程
提示:调用interrupt()方法只是在当前线程中打了一个停止的标记,并不是真正的停止线程。所以有时候并不能停止线程。
1.6.2 判断线程是否是停止状态
在Thread.java类中提供两种方法判断线程的状态:
1.this.interrupt()方法:测试当前线程是否已经中断,这里的当前线程是指运行该方法的线程。
2.this.isInterrupted()方法:测试线程是否已经中断
1.7 暂停线程
在Java多线程中,可以使用suspend()方法暂停线程,使用resume()方法恢复线程执行。
注意:suspend()方法与resume()方法的缺点,它们很容易独占公共的同步对象,使得其它线程无法访问公共同步对象。
注意:这两个方法也容易出现因为线程的暂停而导致数据不同步的情况。
1.8 yield()方法
该方法的作用是放弃当前的CPU资源,将它让给其它的任务去占用CPU执行时间。但是放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
1.9 守护线程
典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。
Daemon的作用是为其它线程的运行提供便利服务,守护线程最典型的应用就是GC(垃圾回收器),它是一个称职的守护者。